#include "stdafx.h"
#include "Actors.h"
#include "../environment/Map.hpp"

namespace actors
{
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////     STATES MACHINE      /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////

bool SpeedBrick::States( fsm::StateMachineEvent event, int state )
{
    Generik::States( event, state );

	BeginStateMachine
	/////////////////////////////////////////////////////////////////
	State( STATE_Initialize )
		OnEnter
			
		OnUpdate

		OnExit
	/////////////////////////////////////////////////////////////////
	State( STATE_STROLL )
		OnEnter

		OnUpdate

		OnExit
	/////////////////////////////////////////////////////////////////
	State( STATE_HUNT )
		OnEnter

		OnUpdate

		OnExit
	/////////////////////////////////////////////////////////////////
	State( STATE_REPRODUCTION )
		OnEnter

		OnUpdate

		OnExit
        
	/////////////////////////////////////////////////////////////////
	State( STATE_ATTACK )
		OnEnter

		OnUpdate		

		OnExit

	/////////////////////////////////////////////////////////////////
	State( STATE_DEFENSE )
		OnEnter
			
		OnUpdate

		OnExit
	/////////////////////////////////////////////////////////////////
	State( STATE_DEAD )
		OnEnter
            boost::shared_ptr< Event::EventNeedGenerikRemove > speedbrickRemove = boost::make_shared< network::packet::RequestNeedGenerikRemove >( SPEEDBRICK, m_id );
            POST_EVENT( speedbrickRemove );
		OnUpdate
		
		OnExit
			
	/////////////////////////////////////////////////////////////////
	EndStateMachine
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////    FIN STATES MACHINE      /////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////

	SpeedBrick::SpeedBrick() :
		Generik()
	{

	}

	SpeedBrick::~SpeedBrick()
	{

	}

    void SpeedBrick::move()
    {
        Generik::move();

        environment::Map::getSingleton().addSpeedBrickScent( (int) m_position.X, (int) m_position.Z, m_age );
    }

    void SpeedBrick::Reproduce()
    {
        environment::Map * map = environment::Map::getSingletonPtr();

        GeneticCard newCard;
        newCard = m_geneticCard + m_fatherGeneticCard;
        switch ( newCard.getPhase() )
        {
        case NORMAL:
            map->addSpeedBrick( new NormalSpeedBrick( m_position, irr::core::vector3df( RAND(-10,10)+0.1,0,RAND(-10,10)+0.1 ), newCard ) );
            break;
        case NICE:
            map->addSpeedBrick( new NiceSpeedBrick( m_position, irr::core::vector3df( RAND(-10,10)+0.1,0,RAND(-10,10)+0.1 ), newCard ) );
            break;
        case AGA:
            map->addSpeedBrick( new AGASpeedBrick( m_position, irr::core::vector3df( RAND(-10,10)+0.1,0,RAND(-10,10)+0.1 ), newCard ) );
            break;
        }
    }

    irr::core::vector3df SpeedBrick::SearchCloserScentPrint()
    {
        if( m_position.X < 0 || m_position.X >= (MAP_WIDTH*MAP_TILE_SIZE) || m_position.Z < 0 || m_position.Z >= (MAP_HEIGHT*MAP_TILE_SIZE) )
            return irr::core::vector3df(-1,-1,-1);

	    int _posX = (int) (m_position.X / MAP_TILE_SIZE);
	    int _posZ = (int) (m_position.Z / MAP_TILE_SIZE);
    	
	    irr::core::vector3df Res(-1,-1,-1);
	    int TraceMax=0;
    	
	    // cherche les odeur sur les cases adjasente a la mienne
	    for( int j= _posZ-4; j<=_posZ+4; j++)
	    {
		    for(int i= _posX-4; i<=_posX+4; i++)
		    {
			    if ( !( j == _posZ && i==_posX ) )
                {
			        if( environment::Map::getSingleton().GetBourikScent( i * MAP_TILE_SIZE, j * MAP_TILE_SIZE ) > TraceMax )
			        {
				        Res.X = i * MAP_TILE_SIZE + MAP_TILE_SIZE / 2.0f;
				        Res.Z = j * MAP_TILE_SIZE + MAP_TILE_SIZE / 2.0f;
				        TraceMax = environment::Map::getSingleton().GetBourikScent( i * MAP_TILE_SIZE, j * MAP_TILE_SIZE );
			        }
                }
		    }
	    }

	    return Res;
    }

    Generik* SpeedBrick::GetCloserEnemy()
    {        
        Generik* Res = environment::Map::getSingleton().getCloserBourik( this );
    	
	    return Res;
    }

    Generik* SpeedBrick::GetCloserOppositeSex()
    {
        Generik* Res =  environment::Map::getSingleton().getCloserOppositeSexSpeedBrick( this );;

        return Res;
    }
}